package es.antonio.duarte.abrahamAdmin.struts.actions;

import java.util.Collection;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import es.antonio.duarte.abrahamAdmin.servicios.DiarioServicio;
import es.antonio.duarte.abrahamAdmin.servicios.FraseServicio;
import es.antonio.duarte.abrahamAdmin.struts.Constantes;
import es.antonio.duarte.abrahamAdmin.struts.forms.BuscarCosasForm;
import es.antonio.duarte.abrahamAdmin.struts.forms.BuscarDiarioForm;
import es.antonio.duarte.abrahamAdmin.servicios.CosasServicio;

/**
 * Clase encargada de buscar las cosas basandose en su titulo, en su cuerpo, o en su
 * fecha.
 */
public class BuscarCosasAction extends BaseAction {

   /** Manejador de trazas. */
   private final Log log = LogFactory.getLog(BuscarCosasAction.class);

   /**
    * El servicio de cosas que se utilizará para acceder a la lógica de la
    * aplicación.
    */
   private CosasServicio servicio;

   /**
    * Genera una lista de cosas utilizando el CosasServicio y los guarda
    * en la request bajo el nombre "cosasMostrados" definido en la clase
    * Constantes como NOMBRE_VARIABLE_COSAS. Estas cosas pueden buscarse
    * en base al titulo, cuerpo o la fecha en formato "dd/MM/yyyy". En la
    * aplicación son varios los formularios que interactuan con esta lista de
    * cosas, por lo tanto en vez de ligarlos a un ActionForm los almacenamos
    * en la request directamente para su posterior uso por parte de estos.<br/>
    * Una vez generados nos devuelve el InputForward del action.
    * @param mapping ActionMapping asociado al action
    * @param form ActionForm asocido al action
    * @param request HttpServletRequest asociado al action
    * @param response HttpServletResponse asociado al action
    * @return ActionForward
    * @throws Exception En caso de error en la ejecucion del action
    * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping,
    *      org.apache.struts.action.ActionForm,
    *      javax.servlet.http.HttpServletRequest,
    *      javax.servlet.http.HttpServletResponse)
    */
   @Override
   public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
      logDebug(log, "Accediendo al actionForm");
      BuscarCosasForm formulario = (BuscarCosasForm) form;
      String criterioBusqueda = formulario.getCriterioBusqueda();
      if (formulario.getTipoBusqueda() == Constantes.BUSCAR_TITULO) {
         logDebug(log, "Buscando por título como criterio de búsqueda"
                  + criterioBusqueda);
         Collection consultarPorTitu = null;
         if (criterioBusqueda != null && !criterioBusqueda.equals("")) {
            logDebug(log, "Buscando cosas con criterio espécifico");
            consultarPorTitu = servicio.consultarPorTitulo(criterioBusqueda);
         } else {
            logDebug(log, "Buscando todos los registros");
            consultarPorTitu = servicio.consultar();
         }
         logDebug(log, "Se han obtenido los siguientes resultados de búsqueda "
                  + consultarPorTitu);
         request.setAttribute(Constantes.NOMBRE_VARIABLE_COSAS,
        		 consultarPorTitu);
      }
      if (formulario.getTipoBusqueda() == Constantes.BUSCAR_FECHA) {
         logDebug(log, "Buscando por fecha con criterio de búsqueda "
                  + criterioBusqueda);
         Date fechaABuscar = formulario.getFechaABuscar();
         Collection consultarPorFecha = null;
         if (fechaABuscar != null) {
            logDebug(log, "Buscando cosas con fecha especifica");
            consultarPorFecha = servicio.consultarPorFecha(fechaABuscar);
         } else {
            logDebug(log, "Buscando todos los cosas");
            consultarPorFecha = servicio.consultar();
         }
         logDebug(log, "Se han obtenido los siguientes resultados de búsqueda "
                  + consultarPorFecha);

         request.setAttribute(Constantes.NOMBRE_VARIABLE_COSAS,
                  consultarPorFecha);
      }
      if (formulario.getTipoBusqueda() == Constantes.BUSCAR_CUERPO) {
          logDebug(log, "Buscando por cuerpo como criterio de búsqueda"
                   + criterioBusqueda);
          Collection consultarPorCuerpo = null;
          if (criterioBusqueda != null && !criterioBusqueda.equals("")) {
             logDebug(log, "Buscando cosas con criterio espécifico");
             consultarPorCuerpo = servicio.consultarPorCuerpo(criterioBusqueda);
          } else {
             logDebug(log, "Buscando todos los registros");
             consultarPorCuerpo = servicio.consultar();
          }
          logDebug(log, "Se han obtenido los siguientes resultados de búsqueda "
                   + consultarPorCuerpo);
          request.setAttribute(Constantes.NOMBRE_VARIABLE_COSAS,
         		 consultarPorCuerpo);
       }
      
      
      logDebug(log, "Devolviendo input forward");
      return mapping.getInputForward();
   }

   /**
    * Obtiene el valor de servicio.
    * @return Valor de servicio
    */
   public CosasServicio getServicio() {
      return servicio;
   }

   /**
    * Asigna el valor de servicio.
    * @param servicio Valor a asignar
    */
   public void setServicio(final CosasServicio servicio) {
      this.servicio = servicio;
   }

}
